
<?php

class Grafico2Controller extends Zend_Controller_Action {

   public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function crearAction(){

        if (X\CheckAccess::PageAction('Reporte.Grafico Rubros rentable')) return;

        try{
            // obtener los años en los que hubieron movimientos
            $dates = $this->em->createQueryBuilder()
                    ->select         ('m.fechaMovimiento')
                    ->from           ('Default_Model_Movimiento', 'm')
                    ->orderBy        ('m.fechaMovimiento', 'desc')
                    ->getQuery       ()
                    ->execute        ();

            $substr_array = array();
            foreach($dates as $date)
                array_push($substr_array, substr($date['fechaMovimiento'], 0, 4));
            $substr_array = array_unique($substr_array);
            $substr_array = array_values($substr_array);

            //carga de los años en que hubieron movimientos
            $years_array = array();
            foreach($substr_array as $sub)
                array_push($years_array, array('codigoYear' => $sub, 'nombreYear' => $sub));

            //año actual/mas reciente con movimientos
            $this->view->year = $years_array[0]['codigoYear'];

            // convertir a json
            $this->view->jsonYear = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($years_array),
                "rows"    => $years_array
            ));

        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los datos.'.$e->getMessage();
        }
    }

    public function ajaxFiltroAction()
    {
        if (X\CheckAccess::PageAction('Reporte.Grafico Rubros rentable')) return;

        try{
            // obtener los parametros
              $filtroYear        = $this->_request->getPost('filtroYear');
              $filtroMes         = $this->_request->getPost('filtroMes');
              $filtroMes         = (strlen($filtroMes)==1 && $filtroMes ? '0'.$filtroMes : $filtroMes);

               //rango de fechas: todo un año o un mes en particular
               $fechaInicio = $filtroYear.($filtroMes ? '-'.$filtroMes : '-01').'-01 00:00:00';
               $fechaFin    = $filtroYear.
                              ($filtroMes ? '-'.$filtroMes : '-12').'-'.
                              (date('t',strtotime($filtroMes.'/1/'.$filtroYear))).
                              ' 23:59:59';

               $movs = $this->em->createQueryBuilder()
                        ->select    ('m.fechaMovimiento')
                        ->addSelect ('m.tipoMovimiento')
                        ->addSelect ('m.concepto')
                        ->addSelect ('m.monto')
                        ->addSelect ('cu.codigoCuenta')
                        ->addSelect ('d.nombreDepartamento')
                        ->addSelect ('co.numeroComprobante')
                        ->addSelect ('so.numeroSolicitud')
                        ->addSelect ('r.codigo')
                        ->addSelect ('r.nombreRubro')
                        ->from      ('Default_Model_Movimiento',  'm')
                        ->leftJoin  ('m.cuenta',                 'cu')
                        ->leftJoin  ('cu.departamento',           'd')
                        ->leftJoin  ('cu.rubro',                  'r')
                        ->leftJoin  ('m.comprobante',            'co')
                        ->leftJoin  ('m.solicitud',              'so')
                        ->where     ("m.fechaMovimiento >= '$fechaInicio'")
                        ->andwhere  ("m.fechaMovimiento <=    '$fechaFin'")
                        ->andwhere  ("m.tipoMovimiento is not null")
                        ->getQuery  ()
                        ->execute   ();

                // crear la respuesta en json
                echo Zend_Json::encode(Array(
                    "success" => true,
                    "total"   => count($movs),
                    "rows"    => $movs)
                );

        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los datos.'.$e->getMessage());
        }
    }

    public function pdfAction(){
        try{
 
          $pdf = Zend_Pdf::load('RubrosMaximos.pdf');
  
          $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
          $this->getResponse()->setHeader('Content-disposition', "filename=RubrosMaximos.pdf", true);
          $this->getResponse()->setBody($pdf->render());
        }
        catch(Exception $e){
            $pdf = new Zend_Pdf();
            // create A4 page
           $page = X\Pdf::createPdfPage();//'595:842'
            // define font resource
           $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES_BOLD);
           $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES);

           $page->setFont($font, 6)
                ->drawText($e->getMessage(), 0, 710);

           $pdf->pages[] = $page;

           $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
           $this->getResponse()->setHeader('Content-disposition', "inline; filename=Error.pdf", true);
           $this->getResponse()->setBody($pdf->render());
        }


    }

    public function ajaxCrearAction(){

        if (X\CheckAccess::PageAction('Reporte.Grafico Rubros rentable')) return;
        try{
            //librerias graficas
            include("../library/pchart/class/pData.class.php");
            include("../library/pchart/class/pDraw.class.php");
            include("../library/pchart/class/pImage.class.php");

            //datos via post
            $filtroYear        = $this->_request->getPost('codigoYear');
            $filtroMes         = $this->_request->getPost('codigoMes');
            $filtroMes         = (strlen($filtroMes)==1 && $filtroMes ? '0'.$filtroMes : $filtroMes);

            //rango de fechas: todo un año o un mes en particular
               $fechaInicio = $filtroYear.($filtroMes ? '-'.$filtroMes : '-01').'-01 00:00:00';
               $fechaFin    = $filtroYear.
                              ($filtroMes ? '-'.$filtroMes : '-12').'-'.
                              (date('t',strtotime($filtroMes.'/1/'.$filtroYear))).
                              ' 23:59:59';

               $rows = $this->em->createQueryBuilder()
                        ->select    ('m.fechaMovimiento')
                        ->addSelect ('m.tipoMovimiento')
                        ->addSelect ('m.monto')
                        ->addSelect ('cu.codigoCuenta')
                        ->addSelect ('d.nombreDepartamento')
                        ->addSelect ('r.codigo')
                        ->addSelect ('r.nombreRubro')
                        ->from      ('Default_Model_Movimiento',  'm')
                        ->leftJoin  ('m.cuenta',                 'cu')
                        ->leftJoin  ('cu.departamento',           'd')
                        ->leftJoin  ('cu.rubro',                  'r')
                        ->where     ("m.fechaMovimiento >= '$fechaInicio'")
                        ->andwhere  ("m.fechaMovimiento <=    '$fechaFin'")
                        ->andwhere  ("m.tipoMovimiento is not null")
                        ->getQuery  ()
                        ->execute   ();

            //arrays de ingresos y egresos
            $ingresos            = array();
            $egresos             = array();
            $slicedCuentas       = array();
            $departamentos       = array();
            $rubros              = array();
            $cuentasMaximas      = array();
            $rubrosMaximos       = array();            

            //recorrida de los movimientos e ir incrementando
            //los montos de ingresos y egresos de cada departamento
            foreach($rows as $row){                
                $cuenta       = $row['codigoCuenta'];
                //departamentos de cada cuenta
                if (!array_key_exists($cuenta, $departamentos)){
                        $departamentos[$cuenta] = $row['nombreDepartamento'];
                        $rubros[$cuenta] = $row['codigo'].' '.$row['nombreRubro'];
                }
                //acumulacion de los movimientos de las cuentas
                if($row['tipoMovimiento']==1){ //ingreso 
                    //inicializar a 0 los acumulados de cada departamento
                    if (!array_key_exists($cuenta, $ingresos))   $ingresos[$cuenta] = 0;
                    $ingresos[$cuenta] =  $ingresos[$cuenta] + $row['monto'];                  
                }
                else{                          //egreso
                    //inicializar a 0 los acumulados de cada departamento
                    if (!array_key_exists($cuenta, $egresos))   $egresos[$cuenta] = 0;
                    $egresos[$cuenta]  =   $egresos[$cuenta] + $row['monto'];
                }
           }

           //X\Msg::Failure(count($ingresos).' '.count($egresos)); return

           //periodo de busqueda
           $periodo = ($filtroMes ? $filtroMes.'/'.$filtroYear : '   '.$filtroYear);

           // creacion del pdf y parametros de estilizacion
           $pdf = new Zend_Pdf();
           
           //obtener los rubros maximos de ingresos y luego graficarlas en un pdf
           //luego lo mismo para los rubros maximos de egresos
           $this->getMaximos($ingresos, $departamentos, $cuentasMaximas, $rubrosMaximos, $rubros);
           $this->graficaPaginas($pdf, $cuentasMaximas, $rubrosMaximos, 'INGRESOS', $periodo);
           
           //vaciar arrays
           array_splice($cuentasMaximas,0); array_splice($rubrosMaximos,0);

           $this->getMaximos($egresos, $departamentos, $cuentasMaximas, $rubrosMaximos, $rubros);
           $this->graficaPaginas($pdf, $cuentasMaximas, $rubrosMaximos, ' EGRESOS', $periodo);

//           X\Msg::Failure(count($cuentasMaximas).' '.count($rubrosMaximos)); return

           //guardado pdf
           $pdfName='RubrosMaximos';
           $pdf->save($pdfName.'.pdf');


           X\Msg::Success('El reporte se ha creado exitosamente');

        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el informe.'.$e->getMessage().' '.$e->getFile());
        }
    }

    private function arraySliceToArray($toBeSliced, $size){
        $slices = array();         
        $countToBeSliced   = count($toBeSliced);
        $cantPaginas       = ceil($countToBeSliced/$size);

        for($i=0 ; $i<$cantPaginas ; $i++){
            $slice = array_slice($toBeSliced,
                                     $i*$size,
                                     $i*$size+$size,
                                     false);
            array_push($slices, $slice);
        }
        
        return $slices;
    }

    private function getMaximos(&$movimientos, &$departamentos, &$cuentasMaximas, &$rubrosMaximos, &$rubros){
        foreach($movimientos as $key => $val){
                //carga de los departamentos correspondientes a cada cuenta
                $dpto = $departamentos[$key];
                //definir la cuenta con mayores movimientos por departamento
                if (!array_key_exists($dpto, $cuentasMaximas)){
                    $cuentasMaximas[$dpto] = $val;
                    $rubrosMaximos[$dpto]  = $rubros[$key];
                }
                if ($val > $cuentasMaximas[$dpto]){
                    $cuentasMaximas[$dpto] = $val;
                    $rubrosMaximos[$dpto]  = $rubros[$key];
                }
         }
         //ordenar las cuentas mayores de cada departamento decrecientemente
         arsort($cuentasMaximas);
         return 'ok';
    }

    private function graficaPaginas($pdf, &$cuentasMaximas, &$rubrosMaximos, $tipoMovimiento, $periodo){

           $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES_BOLD);

           //partir la cantidad de departamentos de a 4, para mostrar en cada hoja
           //del pdf 4 departamentos
           $slicedCuentas = $this->arraySliceToArray($cuentasMaximas, 4);

           foreach($slicedCuentas as $slice){
                $page = X\Pdf::createPdfPage();

                //titulo y cabeceras del grafico
                $page->setFont($font, 16) ->drawText('MAXIMOS RUBROS POR DEPARTAMENTO', 130, 685);
                $page->setFont($font, 13) ->drawText($tipoMovimiento, 264, 668);
                $page->setFont($font, 13) ->drawText('PERIODO: '.$periodo, 245, 610);

                // datos a representarse en el grafico de barras (suma de los movimientos
                // de cada rubro maximo y su correspondiente descripcion)
                $datos = new pData();
                foreach($slice as $key => $val)
                    $datos->addPoints($val      ,$key.': '.$rubrosMaximos[$key]);

                $datos->addPoints('',"Departamentos");
                $datos->setAxisName(0,"GUARANIES");
                $datos->setAxisDisplay(0,AXIS_FORMAT_CURRENCY);
                $datos->setSerieDescription("Departamentos","RUBROS MAS RENTABLES");
                $datos->setAbscissa("Departamentos");

                //emparejar hasta la cantidad maxima de departamentos por hoja
                for($j = count($slice) ; $j<4 ; $j++)
                    $datos->addPoints(0,'VACIO '.($j+1));
                
                // instanciar la imagen y configuraciones de apariencia
                $scaleMax = max($cuentasMaximas);
                $imagen = $this->drawGraficoBarras($datos, $scaleMax, 850, 775);

                // guardado la imagen en el servidor
                $imagen->Render("rubrosbarras.png");

                //carga del grafico de barras
                $image = Zend_Pdf_Image::imageWithPath("rubrosbarras.png");
                $page->drawImage($image, 44, 125, 550, 600);

                //agregar pagina al pdf y guardarlo
                $pdf->pages[] = $page;

                //eliminacion del grafico
                unlink('rubrosbarras.png');
           }
    }


    private function drawGraficoBarras($data, $max, $width, $height){
      try{
        // instanciar la imagen y configuraciones de apariencia
        $imagen = new pImage($width,$height,$data);
        $settings = array("R"=>240, "G"=>240, "B"=>255);
        $imagen->drawFilledRectangle(0,0,$width,$height,$settings);
        $imagen->drawRectangle(0,0,$width-1,$height-1,array("R"=>0,"G"=>0,"B"=>0));
        $imagen->setFontProperties(array("FontName"=>"../library/pchart/fonts/Forgotte.ttf","FontSize"=>11));

        // creacion del grafico de barras
        $imagen->setGraphArea(90,30,810,610);
        $ScaleFormat = array(
               "DrawSubTicks"=>TRUE,
               "Mode" => SCALE_MODE_MANUAL,
               "ManualScale" => array(0 => array(
                  "Min" => 0,
                  "Max" => $max )));
        $imagen->drawScale($ScaleFormat);
        $imagen->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
        $imagen->setFontProperties(array("FontName"=>"../library/pchart/fonts/pf_arma_five.ttf","FontSize"=>9));
        
        $imagen->drawBarChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_MANUAL,"Rounded"=>TRUE,"Surrounding"=>60));
        $imagen->setShadow(FALSE);
        $imagen->drawLegend(90,670,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_VERTICAL));

        return $imagen;
     }catch(Exception $e){
         return $e->getMessage();
     }
   }

}
?>
